#include <iostream>
#include <functional>

using std::cout;
using std::endl;
using std::bind;

int add(int x, int y)
{
    cout << "int add(int, int)" << endl;
    return x + y;
}

int func(int x, int y, int z)
{
    cout << "int func(int, int, int)" << endl;
    return x + y + z;
}

class Example
{
public:
    int add(int x, int y)
    {
        cout << "int Example::add(int, int)" << endl;
        return x + y;
    }

    static int print(int x, int y)
    {
        cout << "int Example::print(int, int)" << endl;
        return x + y;
    }
};

void test()
{
    //在C语言中，函数名是函数的入口地址，在取地址与不取地址是一样
    //在C++中，普通函数还是具备该特点，但是C++中成员函数的地址，
    //必须要严格的写出来
    //
    //变量有类型 对象也有类型，都是ok
    //函数也是有类型：包括函数的参数列表与函数的返回类型
    //函数的类型也可以称为函数的标签
    //全局add函数的类型：int(int, int)
    //对于f而言，已经通过bind将add函数的参数都设置了值，
    //f的类型就是int()
    //
    //所以bind是可以改变函数形态的(重要)
    auto f = bind(add, 1, 2);
    cout <<"f() = " << f() << endl;

    cout << endl;
    //func函数的类型（标签）：int(int, int, int)
    auto f2 = bind(&func, 1, 2, 3);
    cout <<"f2() = " << f2() << endl;

    cout << endl;
    Example ex;
    //成员函数add的类型：int(Example *, int, int)
    auto f3 = bind(&Example::add, &ex, 10, 30);
    cout << "f3() = " << f3() << endl;

    cout << endl;
    //静态成员函数print的类型：int(int, int)
    auto f4 = bind(&Example::print, 10, 30);
    cout << "f4() = " << f4() << endl;
}

int func2()
{
    return 10;
}

int func3()
{
    return 50;
}

void test2()
{
    func2();
    //....Reactor,反应器模式
    //C语言中的函数都是普通函数，函数名就是函数的入口地址
    typedef int (*pFunc)();
    //延迟调用的思想
    pFunc f = &func2;//注册回调函数
    //...
    //...
    //...
    //...
    cout << "f() = " << f() << endl;//执行回调函数

    f = func3;
    cout << "f() = " << f() << endl;
}

int main(int argc, char **argv)
{
    test2();
    return 0;
}

